package org.jeecg.modules.miniAppCustomerEndPoint.controller;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.platformMasterEndPoint.entity.JxSiteDetailDo;
import org.jeecg.modules.platformMasterEndPoint.mapper.JxSiteDetailMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/jx/jxAboutMe")
@Slf4j
public class AboutMeController {


    @Autowired
    private JxSiteDetailMapper jxSiteDetailMapper;

    /**
     * 获取用户所在站点，可配送的楼栋 和楼层; 返回的数据，即包含可配送的楼栋，也可以在选择楼栋后，联动到可配送楼层的数据
     * 此接口为 可配送楼栋 下拉列表 和 可配送楼层下拉列表提供数据
     *
     * 接口使用场景
     * 1.用户首次下单时，需要填写收货地址，可供选择的收货地址的 大厦，楼层 是下拉列表项，用户只能选择当前已开放的送餐大厦和楼层，不能手动输入
     * 2.用户编辑个人信息时，可以重新选择收获地址的大厦和楼层；
     * @return
     */
    @GetMapping("/querySupplyAddress")
    public Result<?> querySupplyAddressBySiteId(
            @RequestParam("siteId") String siteId,
            @RequestParam(value = "userId", required = false) String userId) {

        JSONObject resultData = new JSONObject();
        JxSiteDetailDo jxSiteDetailDo = jxSiteDetailMapper.selectById(siteId);
        if (jxSiteDetailDo != null) {

            JSONArray supplyAddress = JSONArray.parseArray(jxSiteDetailDo.getSupplyAddress());
            if (supplyAddress == null) {
                log.error("站点 {} 的供餐地址为null，表中数据存在破损，需要进行人工排查", siteId);
                return Result.error("站点信息表中，该站点的供餐地址为null，请联系后台技术人员进行处理");
            }
            // 以数组的方式，存放可供选择的大厦，作为 我的-收获地址【所在大厦】 下拉列表的数据来源
            JSONArray supplyBuildings = new JSONArray();
            // key为 大厦名称，value为 json数组，为已经开放配送的大厦中的楼层 列表，作为 我的-收获地址【楼层】下拉列表的数据来源
            JSONObject buildingFloorMap = new JSONObject();
            /**
             * supplyAddress 的数据格式为
             * [
             *          ["A1栋",["10楼","A110"],["15楼","A115"],["19楼","A119"]],
             *          ["A3栋",["8楼","A38"],["12楼","A312"],["17楼","A317"]],
             *          ["F栋",["9楼","F9"],["11楼","F11"],["16楼","F16"]]
             * ]
             */
            for (int k = 0 ; k < supplyAddress.size(); k ++) {
                // oneSupplyAddress的格式为： ["A1栋",["10楼","A110"],["15楼","A115"],["19楼","A119"]]
                JSONArray oneSupplyAddress = supplyAddress.getJSONArray(k);
                String buildingName = null;
                if (oneSupplyAddress.size() > 0) {
                    buildingName = oneSupplyAddress.getString(0);
                } else {
                    log.error("第 {} 个(json数组中的数据从1开始计数)大厦的供餐地址信息有误，数据为 {}，跳过该大厦，请联系后台技术人员进行处理", (k+1), oneSupplyAddress.toString());
                    continue;
                }
                supplyBuildings.add(buildingName);
                // 描述每个大厦供应地址的json数组，第一个元素是 大厦名称，之后的每一个元素是 楼层和楼层编码 构造的二元组(使用json数组描述的二元组)
                JSONArray floorList = new JSONArray();
                for (int m = 1 ; m < oneSupplyAddress.size() ; m ++) {
                    String floorName = oneSupplyAddress.getJSONArray(m).getString(0);
                    floorList.add(floorName);
                }
                buildingFloorMap.put(buildingName, floorList);
            }
            resultData.put("supplyBuildings", supplyBuildings);
            resultData.put("supplyFloors", buildingFloorMap);

            return Result.ok(resultData);
        } else {
            return Result.error("无法从站点信息表中查找到该id的站点信息，请联系后台技术人员进行处理");
        }
    }
}
